
# coding: utf-8

# # 激活函数库定义
# 由于tensorflow中未包括一些常用激活函数，因此这里统一定义，便于使用

# In[2]:


from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import argparse
import sys
import tensorflow as tf
FLAGS = None
import numpy as np


# In[12]:


class ActivationFunction:
#====================================================================
# init
    def __init__(self):
    # 初始化
        self.flag = 0
    def elu(self,x,a=1):  
        y=[]  
        for i in x:  
            if i>=0:  
                y.append(i)  
            else:  
                y.append(a*np.exp(i)-1)  
        return y
    def selu(self,x):
        with tf.name_scope('elu') as scope:
            alpha = 1.6732632423543772848170429916717
            scale = 1.0507009873554804934193349852946
            return scale*tf.where(x>=0.0, x, alpha*tf.nn.elu(x))
    def lrelu(self,x,alpha=0.2):
        # tensorflow中的lrelu函数没有，改为自定义
        # tf.nn.leaky_relu(features, alpha=0.2, name=None) 
        y=np.maximum(alpha*x,x) 
        return y
    def prelu(self,x,alpha=0.1):
        # 其中ai是可以学习的的。
        # 如果ai=0，那么 PReLU 退化为ReLU；
        # 如果 ai是一个很小的固定值（如ai=0.01），则 PReLU 退化为 Leaky ReLU（LReLU）。
        y=np.maximum(alpha*x,x) 
        return y
    def softplus(self,x):
        y =np.log(np.exp(x)+1)  
        return y
    def softsign(self,x):
        y=x/(np.abs(x)+1) 
        return y
    def swish(self,x):
        return x * tf.nn.sigmoid(x)
    def sigmoid(self,x):
        y=tf.nn.sigmoid(x)
    #     y=1/(1+np.exp(-x))  #等效
        return y
    def tanh(self,x):
        y=np.tanh(x)
        return y


# In[10]:


#test
#af = ActivationFunction()

